/**
 * 装饰类方法
 * @param {function} target 目标对象，为其class
 * @param {string} name 方法名称
 * @param {object} descriptor 描述对象，属性本身
 */
function readonly(target, name, descriptor) {
  console.log(target, name, descriptor)
  // descriptor对象原来的值如下
  // {
  //   value: specifiedFunction,
  //   enumerable: false,
  //   configurable: true,
  //   writable: true
  // };
  descriptor.writable = false
  return descriptor
}


class Person {
  constructor() {
    this.first = 'A'
    this.last = 'B'
  }

  @readonly
  name() {
    return `${this.first} ${this.last}`
  }
}

var p = new Person()
console.log(p.name())
p.name = function () {} // 这里会报错，因为 name 是只读属性